#include"Sem.hpp"
#include"RingQueue.hpp"
#include<pthread.h>

void* consumer(void* args)
{
    RingQueue<int>* rq = static_cast<RingQueue<int>*>(args);
    while(true)
    {
        sleep(1);
        //消费者从环形队列中获取数据
        int data = 0;
        rq->Pop(&data);
        std::cout << "消费者获取到了数据: " << data <<std::endl;
    }
}

void* productor(void* args)
{
    RingQueue<int>* rq = static_cast<RingQueue<int>*>(args);
    int data = 1;
    while(true)
    {
        //生产者向环形队列中放数据
        rq->Enqueue(data);
        std::cout << "生产者向环形队列中写入数据: " << data << std::endl;
        data++;
    }
}

int main()
{
    //主线程创建新线程
    pthread_t c[2] ,p[3];
    //如果是多生产与多消费，就需要解决生产者与生产者、消费者与消费者之间的互斥关系--》添加两把锁
    RingQueue<int>* rq = new RingQueue<int>();

    pthread_create(c , nullptr , consumer , (void*)rq);
    pthread_create(c+1 , nullptr , consumer , (void*)rq);
    pthread_create(p , nullptr , consumer , (void*)rq);
    pthread_create(p+1 , nullptr , consumer , (void*)rq);
    pthread_create(p+1 , nullptr , productor , (void*)rq);

    //等待线程退出
    pthread_join(c[0],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(p[0],nullptr);
    pthread_join(p[1],nullptr);
    pthread_join(p[2] ,nullptr);
}   